package br.com.insight.consultoria.apresentacao.curriculo;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.validator.ValidatorException;

import org.richfaces.component.html.HtmlCalendar;

import br.com.insight.consultoria.apresentacao.messagebean.InsightMB;
import br.com.insight.consultoria.entity.AreaAtuacao;
import br.com.insight.consultoria.entity.ExperienciaProfissional;
import br.com.insight.consultoria.entity.PerguntaSecreta;
import br.com.insight.consultoria.entity.RamoAtividade;
import br.com.insight.consultoria.entity.UsuarioPadrao;
import br.com.insight.consultoria.erro.exception.InsightException;
import br.com.insight.consultoria.negocio.fachada.areaatuacao.FachadaAreaAtuacao;
import br.com.insight.consultoria.negocio.fachada.experienciaprofissional.FachadaExperienciaProfissional;
import br.com.insight.consultoria.negocio.fachada.ramoatividade.FachadaRamoAtividade;
import br.com.insight.consultoria.negocio.fachada.usuariopadrao.FachadaUsuarioPadrao;

public class CurriculoHistoricoProfissionalMB extends InsightMB {
	
	private FachadaExperienciaProfissional fachadaExperienciaProfissional;
	private FachadaUsuarioPadrao fachadaUsuarioPadrao;
	private ExperienciaProfissional experienciaProfissional;
	private FachadaRamoAtividade fachadaRamoAtividade;
	private FachadaAreaAtuacao fachadaAreaAtuacao;
	private AreaAtuacao areaAtuacao;
	private RamoAtividade ramoAtividade;
	private UsuarioPadrao usuarioPadrao;
	private HtmlCalendar htmlCalendarDataInicio;
	
	
	public void inserirHistoricoProfissional(ActionEvent e) throws InsightException{
		
		getExperienciaProfissional().setAreaAtuacao(areaAtuacao);
		getExperienciaProfissional().setRamoAtividade(ramoAtividade);
		getExperienciaProfissional().setUsuario(getUsuarioPadrao());
		getFachadaExperienciaProfissional().inserir(getExperienciaProfissional());
		setExperienciaProfissional(null);
		setAreaAtuacao(null);
		setRamoAtividade(null);
	}
	
	public void excluirHistoricoProfissional(ActionEvent e) throws InsightException{
	
		getExperienciaProfissional().setUsuario(getUsuarioPadrao());
		getFachadaExperienciaProfissional().excluir(getExperienciaProfissional());
		setExperienciaProfissional(null);
		setAreaAtuacao(null);
		setRamoAtividade(null);
	}
	
	public void carregaCamposHistoricoProfissional(ActionEvent e) throws InsightException{
		setExperienciaProfissional(getFachadaExperienciaProfissional().getExperienciaProfissional(getExperienciaProfissional().getId()));
		setRamoAtividade(getExperienciaProfissional().getRamoAtividade());
		setAreaAtuacao(getExperienciaProfissional().getAreaAtuacao());
	}
	
	public void gravarContratacao() throws InsightException{
		getFachadaUsuarioPadrao().alterar(getUsuarioPadrao());
	}
	
	public void gravarCartaApresentacao() throws InsightException{
		getFachadaUsuarioPadrao().alterar(getUsuarioPadrao());
	}
	
	public RamoAtividade getRamoAtividade() {
		if(ramoAtividade==null)
			ramoAtividade=new RamoAtividade();
		return ramoAtividade;
	}
	public void setRamoAtividade(RamoAtividade ramoAtividade) {
		this.ramoAtividade = ramoAtividade;
	}
	public AreaAtuacao getAreaAtuacao() {
		if(areaAtuacao==null)
			areaAtuacao=new AreaAtuacao();
		return areaAtuacao;
	}
	public void setAreaAtuacao(AreaAtuacao areaAtuacao) {
		this.areaAtuacao = areaAtuacao;
	}
	public FachadaAreaAtuacao getFachadaAreaAtuacao() {
		return fachadaAreaAtuacao;
	}
	public void setFachadaAreaAtuacao(FachadaAreaAtuacao fachadaAreaAtuacao) {
		this.fachadaAreaAtuacao = fachadaAreaAtuacao;
	}
	public FachadaRamoAtividade getFachadaRamoAtividade() {
		return fachadaRamoAtividade;
	}
	public void setFachadaRamoAtividade(FachadaRamoAtividade fachadaRamoAtividade) {
		this.fachadaRamoAtividade = fachadaRamoAtividade;
	}
	public FachadaExperienciaProfissional getFachadaExperienciaProfissional() {
		return fachadaExperienciaProfissional;
	}
	public void setFachadaExperienciaProfissional(
			FachadaExperienciaProfissional fachadaExperienciaProfissional) {
		this.fachadaExperienciaProfissional = fachadaExperienciaProfissional;
	}
	public FachadaUsuarioPadrao getFachadaUsuarioPadrao() {
		return fachadaUsuarioPadrao;
	}
	public void setFachadaUsuarioPadrao(FachadaUsuarioPadrao fachadaUsuarioPadrao) {
		this.fachadaUsuarioPadrao = fachadaUsuarioPadrao;
	}
	public ExperienciaProfissional getExperienciaProfissional() {
		if(experienciaProfissional==null)
			experienciaProfissional=new ExperienciaProfissional();
		return experienciaProfissional;
	}
	public void setExperienciaProfissional(
			ExperienciaProfissional experienciaProfissional) {
		this.experienciaProfissional = experienciaProfissional;
	}
	
	public UsuarioPadrao getUsuarioPadrao() {
		if(usuarioPadrao==null)
			usuarioPadrao=new UsuarioPadrao();
		usuarioPadrao.setId(new Long("12345678901"));
		PerguntaSecreta secreta=new PerguntaSecreta();
		secreta.setId(new Long("1"));
		getExperienciaProfissional().setUsuario(usuarioPadrao);
		usuarioPadrao.setPerguntaSecreta(secreta);
		usuarioPadrao.setRespostaPerguntaSecreta("Maria");
		return usuarioPadrao;
	}
	
	public void validatorDataInicioSaida(FacesContext context, UIComponent component, Object value) throws ValidatorException, InsightException {
		Date dataInicio=(Date)htmlCalendarDataInicio.getValue();
		Date dateSaida=(Date)value;
		
		if(dataInicio.getTime()>dateSaida.getTime()){
			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO,
					getMessageBundle("br.com.insight.curriculo.usuario.dataInicioMenorDataFim"), getMessageBundle("br.com.insight.curriculo.usuario.dataInicioMenorDataFim_detail"));
			throw new ValidatorException(message);
		}
		
	}
	
	public void setUsuarioPadrao(UsuarioPadrao usuarioPadrao) {
		this.usuarioPadrao = usuarioPadrao;
	}

	public HtmlCalendar getHtmlCalendarDataInicio() {
		if(htmlCalendarDataInicio==null)
			htmlCalendarDataInicio=new HtmlCalendar();
		return htmlCalendarDataInicio;
	}

	public void setHtmlCalendarDataInicio(HtmlCalendar htmlCalendarDataInicio) {
		this.htmlCalendarDataInicio = htmlCalendarDataInicio;
	}

	public List<ExperienciaProfissional> getListaHistoricoProfissional() throws InsightException{
		return getFachadaExperienciaProfissional().pesquisar(getUsuarioPadrao());
	}

	public Map<String, Object> getListaRamoAtividade() throws InsightException{
		Map<String, Object> lista=new HashMap<String, Object>();
		for (RamoAtividade ramoAtividade : getFachadaRamoAtividade().listaRamoDeAtividades()) {
			lista.put(ramoAtividade.getAtividade(), ramoAtividade.getId());
		}
		return lista;
	}
	
	public Map<String, Object> getListaAreaAtuacao() throws InsightException{
		Map<String, Object> lista=new HashMap<String, Object>();
		for(AreaAtuacao atuacao:getFachadaAreaAtuacao().listarAreaAtuacao()){
			lista.put(atuacao.getAreaAtuacao(), atuacao.getId());
		}
		return lista;
	}
	
}
